package com.me.study.javaCore.enumm;

import org.apache.commons.lang3.StringUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 异常枚举通用接口，通过实现此接口实现枚举分模块
 *
 * @author ME
 * @date 2020/8/3
 */
public interface BaseEnum {

    Map<Class<? extends BaseEnum>, Map<String, BaseEnum>> ENUM_CACHE = new HashMap<>();

    static BaseEnum getEnum(Class<? extends BaseEnum> type, String code) {
        return ENUM_CACHE.get(type).get(code);
    }

    Map<Class<? extends BaseEnum>, Map<String, String>> code2DescCache = new ConcurrentHashMap<>();

    /**
     * 使用给定的 枚举类，构建一个 code2Desc Map，并添加到全局的 code2DescCache 中
     * BaseEnum 表示定义好公共方法的接口类，如：getCode()、getDesc()
     *
     * @param clazz 枚举类型
     * @return 返回给定枚举的 code2Desc Map
     */
    static Map<String, String> getCode2DescMap(Class<? extends BaseEnum> clazz) {
        return code2DescCache.computeIfAbsent(clazz, k -> {
            Map<String, String> map = new HashMap<>();
            for (BaseEnum type: clazz.getEnumConstants()) {
                map.put(type.getCode(), type.getDesc());
            }

            return map;
        });
    }

    /**
     * code 转 desc，BaseEnum.code2Desc(RechargeTypeEnum.class, this.rechargeType);
     *
     * @param clazz     枚举类型
     * @param code      枚举编码
     * @return          枚举描述
     */
    static String code2Desc(Class<? extends BaseEnum> clazz, String code) {
        if (StringUtils.isBlank(code)) {
            return "";
        }

        return getCode2DescMap(clazz).get(code);
    }

    /**
     * 获取枚举 code
     * @return
     */
    String getCode();

    /**
     * 获取枚举 说明
     * @return
     */
    String getDesc();
}
